﻿/**
 * 树形表格。
 */
Ext.define('Happy.tree.Panel', {
    extend: 'Ext.tree.Panel',
    alias: 'widget.happy-tree',
    mixins: {
        'list': 'Happy.table.mixin.List',
        'sceneable': 'Happy.mixin.Sceneable'
    },
    requires: [
        'Happy.tree.action.Delete'
    ],

    /**
     * @cfg 重写 ExtJs。
     */
    rootVisible: false,

    constructor: function (config) {
        var me = this;

        if (config && config.scene) {
            me.initScene(config.scene);
            delete config.scene;
        }

        me.callParent(arguments);
    },

    /**
     * 重写 ExtJs。
     * 
     * @protected
     */
    initComponent: function () {
        var me = this;

        me.mixins.list.configDefaultPlugins.apply(me, arguments);

        me.configComponent();

        me.callParent(arguments);
    },

    /**
     * @inheritdoc
     */
    createRecord: function (record) {
        var me = this;

        // TODO:JS 默认值应该可以配置，ParentId 不要使用硬编码。
        var value = {};
        if (record) {
            Ext.apply(value, {
                ParentId: record.getId()
            });
        }

        return me.getStore().getProxy().getModel().create(value);
    },

    /**
     * @inheritdoc
     */
    insertRecord: function (record) {
        var me = this;

        var parentId = record.getServerParentId();
        var parentNode = me.getStore().getNodeById(parentId);

        // 如果父节点已经加载了，就将子节点添加到父节点中，否则不用添加，等你展开父节点的时候，自己的会自动加载。
        if (parentNode.isLoaded()) {
            parentNode.appendChild(record);
        }
    },

    /**
     * @inheritdoc
     */
    updateRecord: function (record) {
        var me = this;

        var parentId = record.getServerParentId();
        var parentNode = me.getStore().getNodeById(parentId);

        if (!parentNode) {
            return;
        }

        // 如果父节点发送了变化，修正树形结构。
        if (parentNode != record.parentNode && parentNode.isLoaded()) {
            parentNode.appendChild(record);
        }
        else {
            parentNode.expand(false, function () {
                parentNode.appendChild(record);
            });
        }
    }
});